/**
 * 矩阵键盘: https://www.bilibili.com/video/BV1Mb411e7re?p=15
 * 在键盘中按键数量较多时，为了减少I/O口的占用，通常将按键排列成矩阵形式
 * 采用逐行或逐列的“扫描”，就可以读出任何位置按键的状态
 * 
 * 板子问题:
 * ∵P15 引脚还连接了"五线四项步进电机", 步进电机又连接了"蜂鸣器", ∴键盘"逐行扫描"时, 蜂鸣器会响, 关不掉.
 * ∴使用"逐列扫描"
 * 
 * 高电平引脚: 1, 若上拉, 接低电平=0
 * 低电平引脚: 0, 强下拉, 驱动能力强, 接高电平时, 能把高电平拉下来
 * 所以IO口, 能输入/输出
 * 见"STC89C52.pdf": 第4章 STC89C52系列单片机的I/O口结构
 */
#include "Link/LCD1602_Utils.h"
#include "Link/Matrix_Keyboard.h"

void main_matrix_keyboard() {
    unsigned char pressedKey;
    LCD1602_Init(1);
    LCD_ShowString(1, 1, "Matrix Key:");
    while (1) {
        pressedKey = MatrixKeyDown(1);
        if (pressedKey) {
        /**
         * FIXME
         * TX-1C, 先按行扫描, 不行
         *   1.只是扫描, 当按第1列按键时, 即使不调用液晶显示数字, 也会有问题(第1行会接着显示':')
         *   2.         当按第1列按键时, if调用液晶显示数字, 也会有问题(显示长度有问题)
         */
            // LCD_ShowNum(2, 1, pressedKey, 2);    //1
            LCD_ShowNum(2, 1, pressedKey, 2);       //2

            //第1列有问题, 用空格覆盖掉
            if (pressedKey == 1 || pressedKey == 5 || pressedKey == 9 || pressedKey == 13) {
                LCD_ShowString(2, 3, "              ");
            }
        }
    }
}